/*
 * @Author: lin_zizhuo 2297304135@qq.com
 * @Date: 2023-12-01 07:19:51
 * @LastEditors: lin_zizhuo 2297304135@qq.com
 * @LastEditTime: 2023-12-01 08:29:20
 * @FilePath: /sig_chld/mysignal.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */

// 通过测试可以得到，在子进程退出的时候，会向父进程发送sig_chld信号，通过这一特性
// 可以做到基于信号的等待方式
#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;

// 当前无法解决多个子进程同时退出的情况？
// 如何解决？
// 1. 在捕捉函数内部循环调用waitpid
// 2. 将17号信号捕捉方式设置成SIG_IGN(只在Linux系统下一定有效，其他类nuix系统不确定)
void myhandler(int signo)
{
    // sleep(5);
    pid_t rid;
    while ((rid = waitpid(-1, nullptr, WNOHANG)) > 0)
    {
        cout << "my pid is : " << getpid() << ",I get the quit proc: " << rid << endl;
    }
}

int main()
{
    // signal(SIGCHLD, myhandler);
    signal(SIGCHLD, SIG_IGN);
    for (int i = 0; i < 10; ++i)
    {
        pid_t id = fork();
        sleep(3);
        if (id == 0)
        {
            // child
            while (true)
            {
                cout << "I'm child process, my pid is: " << getpid() << endl;
                break;
            }
            cout << "child process quit!\n";
            exit(0);
        }
    }
    while (true)
    {
        cout << "I'm the parent process, my pid is: " << getpid() << endl;
        sleep(1);
    }
    return 0;
}